package com.jkl.service.button;

import com.jkl.dao.button.ButtonMapper;
import com.jkl.dao.menu.BsMenuMapper;
import com.jkl.entity.button.BsRoleButton;
import com.jkl.entity.button.Button;
import com.jkl.entity.button.ButtonPo;
import com.jkl.entity.button.ButtonVo;
import com.jkl.entity.menu.BsMenu;
import com.jkl.service.button.inter.ButtonServiceInter;
import com.jkl.service.menu.inter.BsMenuServiceInterface;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author liuzhennan
 * @create 2021-03-22 16:27
 */
@Service
@Slf4j
public class ButtonService implements ButtonServiceInter {
    @Autowired
    private ButtonMapper buttonMapper;
    @Autowired
    private BsMenuMapper bsMenuMapper;

    @Autowired
    private BsMenuServiceInterface bsMenuServiceInterface;
    @Override
    public int addButton(Button button) {
        return buttonMapper.addButton(button);
    }

    @Override
    public Button selectButtonByMenuIdAndButtonCode(Button button) {
        Button button1 = buttonMapper.selectButtonByMenuIdAndButtonCode(button);
        return button1;
    }

    @Override
    public List<Button> selectButtonListByMenuId(Integer menuId) {
        List<Button> buttons = buttonMapper.selectButtonListByMenuId(menuId);
        return buttons;
    }

    @Override
    public BsRoleButton selectButtonAndRole(ButtonVo buttonVo) {
        BsRoleButton bsRoleButton = buttonMapper.selectButtonAndRole(buttonVo);
        return bsRoleButton;
    }

    @Override
    public void addButtonAndRole(ButtonPo buttonPo) {
        buttonMapper.addButtonAndRole(buttonPo);
    }

    @Override
    public void deleteButtonAndRole(ButtonVo buttonVo) {
        buttonMapper.deleteButtonAndRole(buttonVo);
    }

    @Override
    public List<ButtonVo> selectAllButtonWithTree() {
        HashSet<Integer> set = new HashSet<>();
        List<Integer> flag = new ArrayList<>();
        List<ButtonVo> level3 = new ArrayList<>();
        List<ButtonVo> level2 = new ArrayList<>();
        List<ButtonVo> level1 = new ArrayList<>();
        List<ButtonVo> allButtonVo = new ArrayList<>();

        List<ButtonVo> level4 = buttonMapper.selectAllButtonVo();
        for (int i = 0; i < level4.size(); i++) {
            level4.get(i).setLevel(4);
        }

        for (int i = 0; i < level4.size(); i++) {
            flag.add(level4.get(i).getParentId());
        }
        //set
        set.addAll(flag);
        flag.clear();
        flag.addAll(set);
        set.clear();

        //查询需要的3级菜单
        for (int i = 0; i < flag.size(); i++) {
            ButtonVo buttonVo = buttonMapper.selectAllButtonVo1(flag.get(i));
            level3.add(buttonVo);
            level3.get(i).setDisabled(true);
        }
        //清空flag
        flag.clear();
        for (int i = 0; i < level3.size(); i++) {
            flag.add(level3.get(i).getParentId());
        }
        //set
        set.addAll(flag);
        flag.clear();
        flag.addAll(set);
        set.clear();
        //查询需要的2级菜单
        for (int i = 0; i < flag.size(); i++) {
            ButtonVo buttonVo = buttonMapper.selectAllButtonVo1(flag.get(i));
            level2.add(buttonVo);
            level2.get(i).setDisabled(true);
        }
        //清空flag
        flag.clear();
        for (int i = 0; i < level2.size(); i++) {
            flag.add(level2.get(i).getParentId());
        }
        //set
        set.addAll(flag);
        flag.clear();
        flag.addAll(set);
        set.clear();
        //查询需要的1级菜单
        for (int i = 0; i < flag.size(); i++) {
            ButtonVo buttonVo = buttonMapper.selectAllButtonVo1(flag.get(i));
            level1.add(buttonVo);
            level1.get(i).setDisabled(true);
        }
        allButtonVo.addAll(level1);
        allButtonVo.addAll(level2);
        allButtonVo.addAll(level3);
        allButtonVo.addAll(level4);
        List<ButtonVo> buttonVos = assembleMenu(allButtonVo);
        return buttonVos;
    }

    @Override
    public void deleteAllButtonByRole(Integer roleId) {
        buttonMapper.deleteAllButtonByRole(roleId);
    }

    @Override
    public List<Integer> getButtonByRoleId(Integer rowId) {
        List<Integer> integerList = new ArrayList<>();
        List<Integer> integers = buttonMapper.selectButtonIdByRoleID(rowId);
//        for (Integer integer : integers) {
//            Integer integer1 = buttonMapper.selectMenuIdByRowId(integer);
//            integerList.add(integer1);
//        }
        return integers;
    }

    private static List<ButtonVo> assembleMenu(List<ButtonVo> rootMenu) {
        List<ButtonVo> list1 = new ArrayList<>();
        List<ButtonVo> list2 = new ArrayList<>();
        List<ButtonVo> list3 = new ArrayList<>();
        List<ButtonVo> list4 = new ArrayList<>();
        for (ButtonVo bsMenu : rootMenu) {
            if (bsMenu.getLevel().intValue() == 1) {
                list1.add(bsMenu);
            } else if (bsMenu.getLevel().intValue() == 2) {
                list2.add(bsMenu);
            } else if (bsMenu.getLevel().intValue() == 3) {
                list3.add(bsMenu);
            } else if (bsMenu.getLevel().intValue() == 4) {
                list4.add(bsMenu);
            }
        }

        for (int i = 0; i < list4.size(); i++) {
            for (int j = 0; j < list3.size(); j++) {
                if (list4.get(i).getParentId().equals(list3.get(j).getRowId())){
                    list3.get(j).getMenu().add(list4.get(i));
                }
            }
        }
        for (int i = 0; i < list3.size(); i++) {
            for (int j = 0; j < list2.size(); j++) {
                if (list3.get(i).getParentId().equals(list2.get(j).getRowId())){
                    list2.get(j).getMenu().add(list3.get(i));
                }
            }
        }
        for (int i = 0; i < list3.size(); i++) {
            for (int j = 0; j < list1.size(); j++) {
                if (list2.get(i).getParentId().equals(list1.get(j).getRowId())){
                    list1.get(j).getMenu().add(list2.get(i));
                }
            }
        }
//        for (ButtonVo bsMenu : list2) {
//            List<ButtonVo> BsMenuList = new ArrayList<>();
//            for (ButtonVo bsMenu1 : list3) {
//                if (bsMenu.getRowId().equals(bsMenu1.getParentId())) {
//                    BsMenuList.add(bsMenu1);
//                }
//            }
//            bsMenu.setMenu(BsMenuList);
//        }
//        for (ButtonVo bsMenu : list1) {
//            List<ButtonVo> BsMenuList = new ArrayList<>();
//            for (ButtonVo bsMenu1 : list2) {
//                if (bsMenu.getRowId().equals(bsMenu1.getParentId())) {
//                    BsMenuList.add(bsMenu1);
//                }
//            }
//            bsMenu.setMenu(BsMenuList);
//        }
        return list1;
    }
    //    @Override
//    public List<BsMenu> selectAllButtonWithTree() {
//        List<BsMenu> bsMenuList = new ArrayList<>();
//        List<Integer> parentId = new ArrayList<>();
//        List<BsMenu> superiorMenuList = new ArrayList<>();
//        Set<Integer> set = new HashSet<>();
//        List<Integer> menuId = buttonMapper.selectDifferentMenuId();
//        List<BsMenu> allMenu = bsMenuServiceInterface.getBsMenu(menuId);
////        List<BsMenu> allMenu = bsMenuServiceInterface.getAllBsMenu();
//        bsMenuList.addAll(allMenu);
//        //得到二级菜单
//        //得到所有二级菜单
//        List<BsMenu> allLevel2Menu = bsMenuServiceInterface.getAllLevel2Menu();
//        for (int i = 0; i < bsMenuList.size(); i++) {
//            parentId.add(bsMenuList.get(i).getParentId());
//        }
//        //保证唯一性
//        set.addAll(parentId);
//        parentId.clear();
//        parentId.addAll(set);
//
//        for (int i = 0; i < parentId.size(); i++) {
//            for (int i1 = 0; i1 < allLevel2Menu.size(); i1++) {
//                if (allLevel2Menu.get(i1).getRowId().equals(parentId.get(i))){
//                    superiorMenuList.add(allLevel2Menu.get(i1));
//                }
//            }
//        }
//        parentId.clear();
//        set.clear();
//        for (int i = 0; i < superiorMenuList.size(); i++) {
//            parentId.add(superiorMenuList.get(i).getParentId());
//        }
//        //保证唯一性
//        set.addAll(parentId);
//        parentId.clear();
//        parentId.addAll(set);
//
//        //得到所有一级菜单的id
//        List<BsMenu> allLevel1Menu = bsMenuServiceInterface.getAllLevel1Menu();
//        for (int i = 0; i < parentId.size(); i++) {
//            for (int i1 = 0; i1 < allLevel1Menu.size(); i1++) {
//                if (allLevel1Menu.get(i1).getRowId().equals(parentId.get(i))){
//                    superiorMenuList.add(allLevel1Menu.get(i1));
//                }
//            }
//        }
//
//        List<BsMenu> bsMenu = bsMenuServiceInterface.getBsMenu(parentId);
//        bsMenuList.stream().map((i) -> {
//            return i.getButtonList().addAll(buttonMapper.selectButtonListByMenuId(i.getRowId()));
//        }).collect(Collectors.toList());
//        superiorMenuList.addAll(bsMenuList);
//        List<BsMenu> bsMenus = MenuUntil.assembleMenu(superiorMenuList);
////        superiorMenuList.stream().map((i) ->{
////            i.setMenu(getChidrens(i,superiorMenuList));
////            return i;
////        }).collect(Collectors.toList());
//        return bsMenus;
//    }
    //递归查找所有部门的子部门
    private List<BsMenu> getChidrens(BsMenu root, List<BsMenu> all){

        List<BsMenu> children = all.stream().filter(BsMenu ->
                BsMenu.getParentId().equals(root.getRowId())
        ).map(i -> {
            i.setMenu(getChidrens(i,all));
            return i;
        }).collect(Collectors.toList());

        return children;
    }

}
